import { encodingForModel, Tiktoken, type TiktokenModel } from "js-tiktoken";
import { Ref, ref } from "vue";
export const modelNames = [
  "davinci-002",
  "babbage-002",
  "text-davinci-003",
  "text-davinci-002",
  "text-davinci-001",
  "text-curie-001",
  "text-babbage-001",
  "text-ada-001",
  "davinci",
  "curie",
  "babbage",
  "ada",
  "code-davinci-002",
  "code-davinci-001",
  "code-cushman-002",
  "code-cushman-001",
  "davinci-codex",
  "cushman-codex",
  "text-davinci-edit-001",
  "code-davinci-edit-001",
  "text-embedding-ada-002",
  "text-similarity-davinci-001",
  "text-similarity-curie-001",
  "text-similarity-babbage-001",
  "text-similarity-ada-001",
  "text-search-davinci-doc-001",
  "text-search-curie-doc-001",
  "text-search-babbage-doc-001",
  "text-search-ada-doc-001",
  "code-search-babbage-code-001",
  "code-search-ada-code-001",
  "gpt2",
  "gpt-3.5-turbo",
  "gpt-35-turbo",
  "gpt-3.5-turbo-0301",
  "gpt-3.5-turbo-0613",
  "gpt-3.5-turbo-1106",
  "gpt-3.5-turbo-0125",
  "gpt-3.5-turbo-16k",
  "gpt-3.5-turbo-16k-0613",
  "gpt-3.5-turbo-instruct",
  "gpt-3.5-turbo-instruct-0914",
  "gpt-4",
  "gpt-4-0314",
  "gpt-4-0613",
  "gpt-4-32k",
  "gpt-4-32k-0314",
  "gpt-4-32k-0613",
  "gpt-4-turbo-preview",
  "gpt-4-1106-preview",
  "gpt-4-0125-preview",
  "gpt-4-vision-preview",
];
export const useTikToken = (
  content?: Ref<string> | null,
  modelName: TiktokenModel = "gpt-3.5-turbo"
) => {
  let enc: Tiktoken;
  const tokenNum = ref(0);
  watch(
    () => content!.value,
    () => {
      try {
        if (!content) return;
        if (!enc) {
          enc = encodingForModel(
            modelNames.includes(modelName) ? modelName : "gpt-3.5-turbo"
          );
        }
        tokenNum.value = enc.encode(content.value).length;
      } catch (error) {
        console.error("Error calculating token number:", error);
        tokenNum.value = 0;
      }
    }
  );
  return { tokenNum };
};
